package miniBanco.Mapper;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import miniBanco.Dto.UsuarioDTO;
import miniBanco.Exceptions.HandledSQLException;
import miniBanco.Mapper.Interface.IUsuarioDao;
import basics.DBManager;

public class UsuarioDAO implements IUsuarioDao 
{
	private static final String TAG = UsuarioDAO.class.getSimpleName();
	@Override
	public void deleteUsuarioByUsername(String username) {
		String sql = "DELETE FROM usuarios WHERE user = '" + username + "'";
		Connection c = DBManager.connect();
		try {
			Statement s = c.createStatement();
			s.executeUpdate(sql);
			c.commit();
		} catch (SQLException e) {
			try {
				c.rollback();
				DBManager.Error(e);
				throw new HandledSQLException(e.getMessage());
			} catch (SQLException e1) {
				DBManager.Error(e);
				throw new HandledSQLException("Se produjo un error al hacer el rollback :(.");
			}
		} finally {
			try {
				c.close();
			} catch (SQLException e1) {
				DBManager.Error(e1);
				throw new HandledSQLException("Se produjo un error al cerrar la conexion.");
			}
		}
		
		DBManager.Log(TAG, String.format("Borre un usuario. ID:%s", username));
	}

	@Override
	public ArrayList<UsuarioDTO> getAllUsuarios()    {
		UsuarioDTO retorna = null;
		ArrayList<UsuarioDTO> usuarioList = new ArrayList<UsuarioDTO>();
		String sql = "SELECT * FROM usuarios";
		Connection c = DBManager.connect();
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(sql);
			
			while(rs.next()) {
				String u = rs.getString("user");
				String e = rs.getString("email");
				String p = rs.getString("pass");
				retorna = new UsuarioDTO();
				retorna.setEmail(e);
				retorna.setPassword(p);
				retorna.setUsername(u);
				usuarioList.add(retorna);
			}
			
		} catch (SQLException ex) {
				DBManager.Error(ex);
				try {
					c.rollback();
				} catch (SQLException e) {
					DBManager.Error(e);
					throw new HandledSQLException("Se produjo un error al hacer el rollback :(.");
				}
				throw new HandledSQLException(ex.getMessage());

		} finally {
				try {
					c.close();
				} catch (SQLException e) {
					DBManager.Error(e);
					throw new HandledSQLException("Se produjo un error al cerrar la conexion.");
				}
		}
		

		
		return usuarioList;
	}

	@Override
	public UsuarioDTO getUsuarioByUsername(String username) {
		UsuarioDTO retorna = null;
		String sql = "SELECT * FROM usuarios WHERE user = '" + username + "'";
		Connection c = DBManager.connect();
		try {
			Statement s = c.createStatement();
			ResultSet rs = s.executeQuery(sql);
			
			while(rs.next()) {
				String u = rs.getString("user");
				String e = rs.getString("email");
				String p = rs.getString("pass");
				retorna = new UsuarioDTO();
				retorna.setEmail(e);
				retorna.setPassword(p);
				retorna.setUsername(u);
			}
			
		} catch (SQLException ex) {
			try {
				c.rollback();
				DBManager.Error(ex);
				throw new HandledSQLException(ex.getMessage());
			} catch (SQLException ex1) {
				DBManager.Error(ex1);
				throw new HandledSQLException("Se produjo un error al hacer el rollback :(.");
			}
		} finally {
			try {
				c.close();
			} catch (SQLException ex) {
				DBManager.Error(ex);
				throw new HandledSQLException("Se produjo un error al cerrar la conexion.");
			}
		}
		return retorna;
	}

	@Override
	public void insertarUsuario(UsuarioDTO u)   {
		String sql = "INSERT INTO usuarios (user, email, pass) VALUES ('" + u.getUsername() + "', '" + u.getEmail() + "', '" + u.getPassword() + "')";
		Connection c = DBManager.connect();
		try {
			Statement s = c.createStatement();
			s.executeUpdate(sql);
			c.commit();
		} catch (SQLException e) {
			try {
				e.printStackTrace();
				c.rollback();
				DBManager.Error(e);
				throw new HandledSQLException("Se produjo un error al insertar un usuario.");
			} catch (SQLException ex) {
				ex.printStackTrace();
				DBManager.Error(ex);
				throw new HandledSQLException("Se produjo un error al insertar un usuario.");
			}
		} finally {
			try {
				c.close();
			} catch (SQLException ex) {
				DBManager.Error(ex);
				throw new HandledSQLException("Se produjo un error al cerrar la conexion.");
			}
		}
		DBManager.Log(TAG, String.format("Inserte un usuario. ID:%s", u.getUsername()));
	}

	@Override
	public void updateUsuario(UsuarioDTO u)    {
		String sql = "UPDATE usuarios set email = '" + u.getEmail() + "', pass = '" + u.getPassword() + "' WHERE user = '" + u.getUsername() + "'";
		Connection c = DBManager.connect();
		try {
			Statement s = c.createStatement();
			s.executeUpdate(sql);
			c.commit();
		} catch (SQLException e) {
			try {
				c.rollback();
				e.printStackTrace();
			} catch (SQLException ex) {
				DBManager.Error(ex);
				throw new HandledSQLException("Se produjo un error al cerrar la conexion.");
			}
		} finally {
			try {
				c.close();
			} catch (SQLException ex) {
				DBManager.Error(ex);
				throw new HandledSQLException("Se produjo un error al cerrar la conexion.");
			}
		}
		DBManager.Log(TAG, String.format("Modifique un usuario. ID:%s", u.getUsername()));
	}

}
